﻿
using System;
using System.Windows.Forms;
using n_FileType;
using v_GForm;
using n_ImageEditForm;


namespace U
{
public static class U
{
	public static GForm m;
	
	//画板
	public static n_ImageEditForm.Form1 ImageEditBox;
	
	static bool FirstRun = true;
	
	[STAThread]
	static void Main(string[] Args)
	{
		/** 
		 * 当前用户是管理员的时候，直接启动应用程序
		 * 如果不是管理员，则使用启动对象启动程序，以确保使用管理员身份运行
		 */
		//获得当前登录的Windows用户标示
		System.Security.Principal.WindowsIdentity identity = System.Security.Principal.WindowsIdentity.GetCurrent();
		//创建Windows用户主题
		Application.EnableVisualStyles();
		
		System.Security.Principal.WindowsPrincipal principal = new System.Security.Principal.WindowsPrincipal(identity);
		//判断当前登录用户是否为管理员
		if (principal.IsInRole(System.Security.Principal.WindowsBuiltInRole.Administrator)) {
			//如果是管理员，则直接运行
			
			Application.EnableVisualStyles();
			
			try {
				//初始化
				A.isGForm = true;
				
				n_OS.OS.DefaultUser = "Carto";
				n_OS.OS.DefaultUserFile = "ca";
				
				string dfile = A.Init( Args );
				if( dfile == "Q" ) {
					return;
				}
				
				FileExternNameReg_Linkboy();
				//if( n_OS.OS.USER == n_OS.OS.USER_linkboy ) {
					FileExternNameReg_Remo();
				//	FileExternNameReg_Iny();
				//}
				
				m = new GForm( dfile );
				
				//运行工作台
				Application.Run( m );
				
				A.Close();
			}
			catch(Exception e) {
				MessageBox.Show( e.ToString() );
			}
		}
		else {
			
			//创建启动对象
			System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
			//设置运行文件
			startInfo.FileName = System.Windows.Forms.Application.ExecutablePath;
			//设置启动参数
			startInfo.Arguments = String.Join(" ", Args);
			//设置启动动作,确保以管理员身份运行
			startInfo.Verb = "runas";
			//如果不是管理员，则启动UAC
			System.Diagnostics.Process.Start(startInfo);
			//退出
			System.Windows.Forms.Application.Exit();
		}
	}
	
	//文件扩展名判断和设定
	public static void FileExternNameReg_Linkboy()
	{
		string FileName = n_OS.OS.USER;
		
		//判断是否已绑定 linkboy
		string SysLinkboyexe = n_OS.OS.SystemRoot + FileName + ".exe";
		bool isok = FileType.isSaveRegFileType( SysLinkboyexe, "." + n_OS.OS.LinkboyFile );
		if( !isok ) {
			
			ShowFirstMessage();
			
			string Mes = "为了用户可以直接双击打开项目文件(." + n_OS.OS.LinkboyFile + ")并进行编辑,\n";
			Mes += "系统将会关联此类文件的打开方式为:\n " + SysLinkboyexe;
			
			if( !G.Donsok ) {
				MessageBox.Show( Mes );
			}
			
			bool ok = FileType.SaveRegFileType( SysLinkboyexe, "." + n_OS.OS.LinkboyFile );
			if( !ok ) {
				string m = "关联[." + n_OS.OS.LinkboyFile + "]文件打开方式时失败, 请您右键选择\"以管理员身份运行\"打开此软件完成此关联操作\n";
				m += "或者您也可以手工设置[." + n_OS.OS.LinkboyFile + "]后缀名文件的打开方式为 " + FileName + ".exe";
				MessageBox.Show( m );
			}
		}
	}
	
	//文件扩展名判断和设定
	public static void FileExternNameReg_Remo()
	{
		//判断是否已绑定 remo
		string SysRemoexe = n_OS.OS.SystemRoot + @"remo-base.exe";  //remo-cv.exe
		bool isok = FileType.isSaveRegFileType( SysRemoexe, "." + FileType.VMachineFile );
		if( !isok ) {
			
			ShowFirstMessage();
			
			string Mes = "为了用户可以直接双击运行vex作品文件(." + FileType.VMachineFile + "),\n";
			Mes += "系统将会关联此类文件的打开方式为:\n " + SysRemoexe;
			
			if( !G.Donsok ) {
				MessageBox.Show( Mes );
			}
			
			bool ok = FileType.SaveRegFileType( SysRemoexe, "." + FileType.VMachineFile );
			if( !ok ) {
				string m = "关联vex文件打开方式时失败, 请您右键选择\"以管理员身份运行\"打开此软件完成此关联操作\n";
				m += "或者您也可以手工设置[.vex]后缀名文件的打开方式为 remo-cv.exe";
				MessageBox.Show( m );
			}
		}
	}
	
	//文件扩展名判断和设定
	public static void FileExternNameReg_Iny()
	{
		//判断是否已绑定 remo
		string SysInyexe = n_OS.OS.SystemRoot + @"MusicBox.exe";
		bool isok = FileType.isSaveRegFileType( SysInyexe, "." + FileType.InyFile );
		if( !isok ) {
			
			ShowFirstMessage();
			
			string Mes = "为了用户可以直接双击打开音乐简谱旋律文件(." + FileType.InyFile + "),\n";
			Mes += "系统将会关联此类文件的打开方式为:\n " + SysInyexe;
			
			if( !G.Donsok ) {
				MessageBox.Show( Mes );
			}
			
			bool ok = FileType.SaveRegFileType( SysInyexe, "." + FileType.InyFile );
			if( !ok ) {
				string m = "关联iny音乐文件打开方式时失败, 请您右键选择\"以管理员身份运行\"打开此软件完成此关联操作\n";
				m += "或者您也可以手工设置[.iny]后缀名文件的打开方式为 MusicBox.exe";
				MessageBox.Show( m );
			}
		}
	}
	
	//第一次运行提示信息
	public static void ShowFirstMessage()
	{
		if( FirstRun ) {
			string FileName = n_OS.OS.USER;
			
			if( G.Donsok ) {
				string Mes = FileName + "用户您好! 系统检测到您是首次安装并运行" + FileName + "软件(或者您刚刚安装了更高的版本),";
				Mes += "为了更好地提升软件的用户体验, 接下来将会执行一些文件关联操作, 您只需依次点击 <确定> 按钮即可.";
				MessageBox.Show( Mes, "首次运行提示" );
			}
			else {
				string Mes = "用户您好! 系统检测到您是首次安装并运行此软件(或者您刚刚安装了更高的版本),";
				Mes += "为了更好地提升软件的用户体验, 接下来将会执行一些文件关联操作, 您只需点击 <确定> 按钮即可.";
				MessageBox.Show( Mes, "首次运行提示" );
			}
		}
		FirstRun = false;
	}
}
}




